API testing with APITestCase {drf}


APITestCase는 Django REST Framework(DRF)에서 제공하는 테스트 도구로, API의 동작을 확인하고 검증하기 위한 강력한 기능을 제공합니다. APITestCase는 Django의 표준 TestCase를 확장하며, 클라이언트 객체를 사용해 HTTP 요청을 테스트할 수 있습니다.


1. APITestCase의 주요 기능


2. APITestCase 사용 방법

APITestCase를 사용하려면 rest_framework.test 모듈에서 가져와야 합니다.

from rest_framework.test import APITestCase
from rest_framework import status
from django.urls import reverse

2.1. 예제: 간단한 CRUD API 테스트

from rest_framework.test import APITestCase
from rest_framework import status
from django.urls import reverse
from myapp.models import Article

class ArticleAPITestCase(APITestCase):
    def setUp(self):
        # 테스트 데이터 생성
        self.article_data = {'title': 'Test Title', 'content': 'Test Content'}
        self.article = Article.objects.create(**self.article_data)
        self.article_url = reverse('article-detail', args=[self.article.id])

    def test_get_article_list(self):
        # GET 요청 테스트
        url = reverse('article-list')
        response = self.client.get(url)

        # 응답 검증
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertIn('title', response.data[0])

    def test_create_article(self):
        # POST 요청 테스트
        url = reverse('article-list')
        data = {'title': 'New Title', 'content': 'New Content'}
        response = self.client.post(url, data)

        # 응답 검증
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(response.data['title'], 'New Title')

    def test_update_article(self):
        # PUT 요청 테스트
        data = {'title': 'Updated Title', 'content': 'Updated Content'}
        response = self.client.put(self.article_url, data)

        # 응답 검증
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data['title'], 'Updated Title')

    def test_delete_article(self):
        # DELETE 요청 테스트
        response = self.client.delete(self.article_url)

        # 응답 검증
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertFalse(Article.objects.filter(id=self.article.id).exists())

3. 인증 및 권한 테스트

APITestCase를 사용하여 인증 및 권한 관련 테스트를 수행할 수 있습니다.

3.1. Token Authentication 테스트

from rest_framework.test import APITestCase
from rest_framework.authtoken.models import Token
from django.contrib.auth.models import User

class AuthenticationAPITestCase(APITestCase):
    def setUp(self):
        # 사용자 생성 및 토큰 발급
        self.user = User.objects.create_user(username='testuser', password='testpassword')
        self.token = Token.objects.create(user=self.user)
        self.client.credentials(HTTP_AUTHORIZATION=f'Token {self.token.key}')

    def test_authenticated_request(self):
        url = reverse('protected-resource')
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)

4. APITestCase의 주요 메서드


5. 장점


6. 테스트 실행

manage.py 명령어로 테스트를 실행할 수 있습니다.

python manage.py test

APITestCase는 REST API의 다양한 기능을 테스트하는 데 필요한 강력한 도구를 제공합니다. 이를 통해 API의 안정성과 품질을 확보할 수 있습니다.